/*
* 封装的综合的Grid控件，继承新增、修改、删除、检索、分页功能。
* code by xzd
*/
 Ext.QuickTips.init();
 
Ext.namespace("Ext.ux.grid");
Ext.ux.grid.MyGrid = Ext.extend(Ext.grid.GridPanel, {
	// 储存表格结构
	structure : '',

	// 表格绑定的表
	tablename : '',
    
	border:false,
	
	// 指定加载的列 默认为读取表上所有列数据
	fields : '',

	// 每页显示条数
	pageSize : 20,
	
	// 表单里控件的默认宽
	fieldwidth : 200,

	// reader类型如果当为json的时候那么url不能空，当为array的时候dataObject不能为空
	readType : 'json',

	// 获取数据的URL
	url : '',

	// 新增的URL
	addUrl : false,

	// 修改的URL
	updateUrl : false,

	// 删除的URL
	delUrl : false,
	
	// 导出的URL
	exportUrl : false,
	
	// 导入的URL
	importUrl : false,
	
	// 数据对象
	dataObject : null,

	// 表格主键
	keyField : '',

	// 绑定查询的列
	findField : null,

	// 是否需要分组，默认为false，如果设置为true须再设置两个参数一个为myGroupField和myGroupTextTpl
	needGroup : false,
	
	// 分组的字段名称
	myGroupField : '',
	// 分组显示的模板，eg：{text} ({[values.rs.length]} {[values.rs.length > 1 ?
	// "Items" : "Item"]})
	myGroupTextTpl : '',

	// 列模式的选择模式,默认为rowselectModel，如果相设置成check模式，就设置为check
	selectType : '',

	// 默认排序字段
	defaultSortField : 'ID',

	// 是否需要分页工具栏，默认为true
	needPage : true,
	//frame : true,

	// 是否带展开按钮，默认为false
	collapsible : false,

	//animCollapse : true,

	loadMask : true,
	
	viewConfig : {
		forceFit : true
	},

	// 存储表头信息
	
	col : null,
	// private
	initComponent : function() {
		if (this.structure != '') {
			this.initStructure();
		}
	
		Ext.ux.grid.MyGrid.superclass.initComponent.call(this);
	},

// private

initEvents : function() {
	Ext.ux.grid.MyGrid.superclass.initEvents.call(this);
	//alert(1);
/*
* this.getStore().load( { params : { start : 0, limit : 30 } });
* 
*/
	//if (this.loadMask) {
	// Ext.MessageBox.wait('sssssss')
		this.loadMask = new Ext.LoadMask(this.bwrap, Ext.apply({
						store : this.store
		 }, { msg : "正在加载中..."}));
	//}

},

// private

initStructure : function() {
		//var oDs = null;
		//生成列模型和record
		var oCmAndRecord =  this.getCmAndRecord();
		//this.col = oCM;
		// 生成columnModel
		this.colModel  = new Ext.grid.ColumnModel(oCmAndRecord.cm);
		// this.colModel = this.cm;
		// 默认可排序
		this.colModel.defaultSortable = true;
		// 生成表格数据容器
		var record = Ext.data.Record.create(oCmAndRecord.record);
		// 判断读取类别，目前只实现了，jsonreader和arrayReader
		var reader;
		var tablename = this.tablename;
		var pageSize = this.pageSize;
		var fields = this.fields;

		var findField = this.findField;
		
		//this.findFieldText = this.colModel.getColumnHeader( this.colModel.findColumnIndex(findField) );
		
		this.initStore(record);

		// 判断是否需要分组
		this.viewConfig  = this.viewConfig||this.getGroupingView();
		// 生成底部分页工具栏
		if (this.needPage) {
			this.bbar = this.getBbar();
			this.bottomToolbar = this.bbar;
		}
	//	var keyField = this.keyField;
		
		this.tbar = this.getTbar();
		//this.topToolbar = this.tbar;
	
		// 将filter加入grid
		// this.plugins = filters;
	
		//tbar上右侧搜索文本域
		this.oSearchField = this.getSearchField();
		
		this.store.on('beforeload', function() {
					var scondition = "";
					if (this.oSearchField.getValue()) {
						scondition = findField + " like '%" + this.oSearchField .getValue() + "%'";
					}
					//alert( this.getBottomToolbar().pageSize);
					var para = {
						action : 'show',
						//limit : this.getBottomToolbar().pageSize,
						name : tablename,
						// fields : fields,
						condition : scondition,
						tmpId : '',
						tmpName : ''
					};
					Ext.apply(this.store.baseParams, para);
		},this);

		this.store.load({
			params : {
				start : 0,
				limit : this.pageSize
			}
		});
	},

/*
* @功能：编辑用户选中的数据 @参数：id 为空则为新增数据 不为空则为修改数据
* 
*/
	doEdit : function(id) {
			
		var tablename = this.tablename;
		var keyField = this.keyField;
		var url = this.url;
		var ogrid = this;
		var oField = new Array();
		var len = this.structure.length;
		var action = "";

	    // 判断id是否为空 是：新增 否：修改
	    this.AddOrUpdateUrl = id ? this.updateUrl: this.addUrl;
	    var action = id?"edit":"add";
	    
	   
	    if (action=="edit") {
	    	var count = this.getSelectionModel().getSelections().length;
	    	if(count>1){
	    		Ext.Msg.alert("系统提示","只能编辑一条数据");
	    		return;
	    	}else if(count==0){
	    		Ext.Msg.alert("系统提示","请选择一条数据进行编辑");
	    		return;
	    	}
	    }
	    
	    var titleMsg = "增加";
	    if( action=="edit" ){
	    	titleMsg = "修改";
	    }
	    //第一次进入判断 如果弹出的form不为空 则使用自定义的form 同时为当前grid.ejectForm 赋上值;如果弹出的form为空 则走else
	    //第>=2次进入判断 则始终走if语句
	    //alert(this.ejectForm)
		if(!Ext.isEmpty(this.ejectForm) ){
				var win = this.getEjectWin();
				win.setTitle(titleMsg);
				//win.removeAll(true);
				//win.add(this.ejectForm);
			//	win.show();
				
				//return;
		}else{
			oField = MyExt.formUtil.getForm(this.structure);
			// ------------- 初始化字段信息 结束------------
			// 初始化表单结构
			this.ejectForm = new Ext.form.FormPanel({
									labelWidth : 80,
									frame : true,
									border : false,
									hideBorders : true,
									autoHeight : true,
									items : oField,
									buttons : [
											{
												text : '保存',
												scope:this,
												handler : function() {
													doSubmitFrom.call(this,this.AddOrUpdateUrl);
												}
											}, {
												text : '关闭',
												scope:this,
												handler : function() {
													this.ejectWin.hide();
													//this.ejectWin.destroy();
												}
											}
									]
					})
				var win = this.getEjectWin();
				win.setTitle(titleMsg);
			//	win.removeAll(true);
			//	win.add(this.ejectForm);
			//	win.show();
		}
		
		win.show();
		MyExt.util.changeIsReadOnly(this.ejectForm.form,this.structure,true,action);

		// 从服务器初始化表单数据
		if (id != null && id != '') {
			Ext.MessageBox.wait('正在数据加载,请稍后......', '请稍后')
			  	var record = this.getSelectionModel().getSelected();//获取选择的记录集
                ////var id = record.get("id");
              //  alert(1);
                //this.showWin("Update");
                this.ejectForm.form.loadRecord(record); //往表单（fp.form）加载数据
                Ext.MessageBox.hide();
		/*	editForm.form.load({
				url : url,
				params : {
					action : 'load',
					name : tablename,
					fieldkey : keyField,
					condition : keyField + "='" + id + "'",
					id : id
				},
				method : 'post',
				success : function(action, form) {
					Ext.MessageBox.hide();
				},
				failure : ogrid.doFailure
				
				});*/
				
				
		}

		// 保存表单数据
		function doSubmitFrom(url) {
			if (ogrid.ejectForm.form.isValid()) {
					Ext.Ajax.request({
							url : url,
							method : 'POST',
							form : ogrid.ejectForm.form.id,
							scope : this,
							waitMsg : '正在保存数据,请等待...', // 显示读盘的动画效果，执行完成后效果消失
							success:function(response){
								var result = Ext.util.JSON.decode(response.responseText);
								if(result.success){
									new Ext.ux.Notification({autoHide:true}).showSuccess('提示', result.msg);
									ogrid.getStore().reload();
									this.ejectWin.hide();
								}else{
									new Ext.ux.Notification().showFailure('提示', result.msg);
								}
								//Ext.Msg.alert('提示', '操作成功');
								
							},
							failure : function() {
								new Ext.ux.Notification().showFailure('提示', '操作失败');
								//Ext.Msg.alert('提示', '操作失败');
								//this.loadCurrData();
							}
						});
						
						
				/*ogrid.ejectForm.form.submit({
					waitTitle : "请稍候",
					waitMsg : "正在提交表单数据，请稍候。。。。。。",
					success : function() {
						ogrid.getStore().reload();
						Ext.Msg.alert('提示', '操作成功');
					},
					failure : ogrid.doFailure
					
					});*/
				}
			}
		},

	/*
	* @功能：删除所有选中记录支持批量删除
	* 
	*/

	doDelete : function() {
					var sSelId = "";
					var ogrid = this;
					var tablename = this.tablename;
					var keyField = this.keyField;
					var url = this.url;
					var aId = new Array();
					// 从GRID对象中获得Value
					var record = this.getSelectionModel().getSelected();
					if (!record) {
						Ext.Msg.alert("提示", "请先选择要删除的数据!");
						return;
					} else {
					for (var i = 0, j = this.store.getCount(); i < j; i++) {
						if (this.getSelectionModel().isSelected(i)) {
							sSelId +=  this.store.getAt(i).get(keyField)+",";
							aId[aId.length] = this.store.getAt(i)
						}
					}
					
					if (sSelId.length > 0) {
						sSelId = sSelId.substr(0, sSelId.length - 1);
						}
					}
					Ext.MessageBox.confirm('确认删除', '你真的要删除所选数据吗?', function(btn) {
						if (btn == 'yes') {// 选中了是按钮
							Ext.MessageBox.wait("正在删除数据，请稍候。。。。。。", "请稍后");
							Ext.Ajax.request({
								url : this.delUrl,
								scope:this,
								success : function(response) {
									Ext.MessageBox.hide();
									var result = Ext.util.JSON.decode(response.responseText);
									if(result.success){
										new Ext.ux.Notification({autoHide:true}).showSuccess('提示', result.msg);
										for (var i = 0; i < aId.length; i++) {
											ogrid.store.remove(aId[i]);
											ogrid.getView().refresh();
										}
									}else{
										new Ext.ux.Notification().showFailure('提示', result.msg);
									}
								},
								failure : ogrid.doFailure,
								params : {
									action : 'delete',
									//name : tablename,
									//fieldkey : keyField,
									ids: sSelId
								}
							});//endof ajax
						}//end of if
				   },this);//endof confirm
		},

		/*
		* @功能：请求成功显示信息
		*/
		doSuccess : function(action, form) {
				Ext.MessageBox.hide();
				var ogrid = this;
		
				Ext.Msg.alert('提示', '操作成功');
				ogrid.getStore().reload();
		},

		/*
		* @功能：请求失败显示信息
		*/
		doFailure : function(action, form) {
			Ext.MessageBox.hide();
			Ext.Msg.alert('请求错误', '服务器未响应，请稍后再试');
		},

		/*
		* @功能:默认的格式化日期函数 @返回格式：2008-09-21
		*/
		formatDate : function(v) {
			return v ? v.dateFormat('Y-m-d') : ''
		},
		
		getSearchField:function(){
			if( Ext.isEmpty(this.oSearchField)){
				this.oSearchField = new Ext.form.TextField({
							//id : 'search',
							xtype : 'textfield',
							align : 'right'
					});
			}
			return this.oSearchField;
		},
		
		getGroupingView:function(){
			return new Ext.grid.GroupingView({
						forceFit : true,
						groupTextTpl : this.myGroupTextTpl||'{text}(共{[values.rs.length]}条)'
			})
		},
		
		getBbar:function(){
				var butItems = [];
				if (this.addUrl) {
							butItems.push({
										iconCls : 'user-add-icon',
										text : "增加新数据",
										scope:this,
										handler : function() {
											this.doEdit();
										}
							});
							butItems.push('-');
				};
				if (this.updateUrl) {
							butItems.push({
									iconCls : 'user-edit-icon',
									text : "编辑当前数据",
									scope:this,
									handler : function() {
											var record = this.getSelectionModel().getSelected();
											if (record == null) {
												Ext.Msg.alert('提示', '请先选择你要编辑的数据');
												return;
											}
											var id = record.get(this.keyField);
											//alert(id);
											this.doEdit(id);
									}
							});
							butItems.push('-');
				};
				if (this.delUrl) {
					butItems.push({
							iconCls : 'user-delete-icon',
							text : "删除所选数据",
							scope:this,
							handler : function() {
								this.doDelete();
							}
					});
					butItems.push('-');
				};
				
				if(this.exportUrl){
					butItems.push({
							iconCls : 'exportToExcel',
							text : "导出数据",
							scope:this,
							handler:function(){
								MyExt.util.exportCurentTable(this,this.exportUrl,this.title||"导出文件");
							}
							/*menu:new Ext.menu.Menu({
							items:[
										{iconCls:"exportToExcel",scope:this,text:"导出当前页",handler:function(){	
											alert(this.exportUrl);
										 }},
										{iconCls:"exportToExcel",text:"导出当前表",handler:function(){	
				
										}}
						    	 ]
							}) */
					})
				}
				if(this.importUrl){
					butItems.push({
						iconCls : 'exportToExcel',
							text : "导入数据",
							scope:this,
							handler : function() {
								//	alert(this.importUrl);
								     var form = new Ext.form.FormPanel({    
												     labelAlign: 'center',    
												     labelWidth: 60,    
												     frame:true, 
												     url: this.importUrl,  
												     width: 300,    
												     border:false,
												     bodyStyle:"margin-top:30",  
												     height:100,   
												     fileUpload: true,//这项一定要要，表是是上传文件   
												     items: [{  
												        xtype: 'textfield', 
												        fieldLabel: '文件路径',    
												        name: 'filePath',    
												        inputType: 'file'//文件类型    
												     }],    
												     buttons: [{    
												        text: '导入',
												        scope:this,    
												        handler: function() {
												        if(form.getForm().isValid() && checkFiletype(form)){
													        var reg=/\\+/;//获取文件名，主要为了区别IE,FireFox
													        var filePath = form.form.findField("filePath").getValue();
													       // alert(filePath)
													       Ext.Msg.show({
															   title: '系统提示',
															   msg: '<font color=black>正在导入中...</font>',
															   width: 250,
															   wait:true,
															   mode:true,
															   progress:true,
															   closable:false  
															});
													        Ext.Ajax.request({
													        	waitMsg:"文件上传中......",  
																url : this.importUrl,
																scope:this,
																form:form.form.id,
																success : function(response) {
																	Ext.MessageBox.hide();
																	var result = Ext.decode(response.responseText);
																	if(result.success){
																		excelWin.hide();
																		new Ext.ux.Notification({autoHide:true}).showSuccess('提示', result.msg);
																	}else{
																		new Ext.ux.Notification().showFailure('提示', result.msg);
																	}
																},
																failure : function(form,action){
																	Ext.MessageBox.hide();
																	new Ext.ux.Notification().showFailure('操作失败','导入失败,请重新导入'); 
																}
															});//endof ajax
							
							
												        
													    /* form.getForm().submit({  
													        waitMsg:"文件上传中......",  
													        success: function(form, action){ 
													        		alert(11);
															        if (action.result.success) {
															        	new Ext.ux.Notification({autoHide:true}).showSuccess('操作成功','文件上传成功!');
															        }else{
																		new Ext.ux.Notification().showFailure('操作失败',action.result.msg);
																	}
													        },    
													        failure: function(form,action){
														          alert("失败")
														          if(action.result.head==2044){
														          	new Ext.ux.Notification().showFailure('操作失败','令牌序列号插入冲突，请重新插入'); 
														          }else{
														          	new Ext.ux.Notification().showFailure('错误', '文件上传失败'); 
														          }
													          
													        }    
												     	});  */
												    } 
												    }   
												  }
										  ]    
										  });  
										excelWin = new Ext.Window({
											    width:310,
											    shadow:false,
											    title:"Excel导入",
												autoHeight:true,
											    resizable:false, 
											    constrain:true, 
											    closeAction:'hide',//点击右上角关闭按钮是动作是把win隐藏
											    layout:'fit',
											    closable:true,
											    modal:true, 
									    	    items:[form]
									     })
									     excelWin.show();   
										 checkFiletype = function(form){
										  	var epath = form.form.findField("filePath").getValue();
										  	if (epath.substring(epath.lastIndexOf(".") + 1).toLowerCase() == "xls" || 
										  		epath.substring(epath.lastIndexOf(".") + 1).toLowerCase() == "xlsx"){
										  		return true;
										  	}else{
										  		new Ext.ux.Notification().showFailure('错误', '只允许导入excel文件'); 
										  		return false;
										  	}
										  }
						}
					})
				}
				
			
			return new Ext.PagingToolbar({
					pageSize : this.pageSize,
					displayInfo : true,
					displayMsg : '当前记录数:{0} - {1} 总记录数: {2}',
					emptyMsg : '没有符合条件的记录',
					plugins:new Ext.ux.Andrie.pPageSize(),
					store : this.store,
					items:butItems
				});
		},
		initStore:function(record){
				switch (this.readType) {
					case 'json' :
						reader = new Ext.data.JsonReader({
									totalProperty : "totalCount",
									root : "items",
									id : this.keyField
								// 关键字段
								}, record);
			
						this.store = new Ext.data.GroupingStore({
										proxy : new Ext.data.HttpProxy({
										url : this.url
									}),
									reader : reader,
									sortInfo : {
										field : this.defaultSortField,
										direction : 'ASC'
									},
									remoteSort : true,
									groupField : this.myGroupField
									/*,listeners : {
										'reload' : function() {
												//alert('reload')
										}
									}*/
						});
						break;
					case 'array' :
						reader = new Ext.data.ArrayReader({}, record);
						this.store = new Ext.data.GroupingStore({
							reader : reader,
							data : this.dataObject,
							sortInfo : {
								field : this.defaultSortField,
								direction : 'ASC'
							},
							groupField : this.myGroupField
						});
						break;
					default :
						break;
				}//endof swith
		}
});

//Ext.ux.grid.MyGrid.prototype.ejectForm = null;

Ext.ux.grid.MyGrid.prototype.getTbar = function(){
				if(this.tbar){
					return this.tbar;
				}
				else {
					return null;
				}
					// 生成顶部工具条
				if(  !Ext.isEmpty(this.tbar ) ){
					return this.tbar;
				}else {
					
				}
};
		

Ext.ux.grid.MyGrid.prototype.getEjectWin =function(){
	if( Ext.isEmpty(this.ejectWin) ){
			//Ext.ux.grid.MyGrid.prototype.ejectWin  = new Ext.Window({
			this.ejectWin = new Ext.Window({
						title :this.title,
						labelWidth : 100,
						frame : true,
						autoHeight : true,
						//height : 400,
						modal: true,
						resizable:false,
			            shadow: false,
						closeAction:"hide",
						width : 450
						,items : this.ejectForm	
						,listeners:{
							"hide":function(){
								this.items.item(0).form.reset();
							}
						}	
		})
	}
	return this.ejectWin;
}

Ext.ux.grid.MyGrid.prototype.getCmAndRecord = function(){
				var oCM = new Array(); // 列模式数组
				
				this.readOnlyField = [];
				var oRecord = new Array(); // 容器对数组
				// 构成grid的两个必须组件: column和record，根据structure将这两个组件创建出来
				
				oCM[oCM.length] = new Ext.grid.RowNumberer();
				// 判断表格的选择模式
				if (this.selectType == 'check') {
					var sm = new Ext.grid.CheckboxSelectionModel();
					oCM[oCM.length] = sm;// 在列模式数组中添加checkbox模式按钮
					this.selModel = sm;// 并将selModel设置为check模式
				}
				
				var len = this.structure.length;// 得到结构的长度
				
				for (var i = 0; i < len; i++) {
					var c = this.structure[i];
			
					// alert( c.hidden ? c.width: this.fieldwidth)
					// 如果字段为hidden，则不生成filters和columnMode
					
					// 默认格式化日期列
					if (c.type == 'date' && !c.renderer) {
						c.renderer = this.formatDate;
					}
					if(c.type == 'label'){
						this.readOnlyField.push({name:c.name,addIsShow:c.addIsShow});
					}
					
					oCM[oCM.length] = {
						header : c.header,
						dataIndex : c.name,
						hidden : c.hidden || false,
						width : !c.hidden ? c.width : this.fieldwidth,
						// 类型为数字则右对齐
						align : c.type == 'numeric' ? 'right' : 'left',
						
						// 结构的渲染函数
						renderer : c.renderer
					};
			
					oRecord[oRecord.length] = {
						name : c.name,
						// 如果类型不是date型则全部为string型
						type : c.type == 'date' ? 'date' : 'string',
						dateFormat : 'Y-m-d'
					};
				}
				return {cm:oCM,record:oRecord};
}
